package com.designpattern.softwaredesignpatternstudy.principle;

/**
 * @Author: Jiangxx
 * @Date: 2021/09/28
 * @Description: 里氏替换原则:子类可以扩展父类的功能，但不能改变父类原有的功能。"几维鸟不是鸟实例"
 * 子类可以实现父类的抽象方法，但不能覆盖父类的非抽象方法
 * 子类中可以增加自己特有的方法
 * 当子类的方法重载父类的方法时，方法的前置条件（即方法的输入参数）要比父类的方法更宽松
 * 当子类的方法实现父类的方法时（重写/重载或实现抽象方法），方法的后置条件（即方法的的输出/返回值）要比父类的方法更严格或相等
 */
public class LiskovSubstitutionPrinciple {
    public static void main(String[] args) {
        Bird bird1 = new Swallow();
        Bird bird2 = new BrownKiwi();
        bird1.setSpeed(120.0);
        bird2.setSpeed(120.0);
        System.out.println("如果飞行300公里：");
        try {
            System.out.println("燕子将飞行" + bird1.getFlyTime(300.0) + "小时.");
            System.out.println("几维鸟将飞行" + bird2.getFlyTime(300.0) + "小时。");
        } catch (Exception err) {
            System.out.println("发生错误了!");
        }
    }
}

class Bird {
    double flySpeed;

    public void setSpeed(Double speed) {
        this.flySpeed = speed;
    }

    public Double getFlyTime(Double distance) {
        return (distance / flySpeed);
    }
}

class Swallow extends Bird {}

class BrownKiwi extends Bird {
    @Override
    public void setSpeed(Double speed) {
        this.flySpeed = 0;
    }
}
